// ignore_for_file: file_names
import 'package:dio/dio.dart';
import 'package:flutter_house_manager/constants/index.dart';

class RequestDio {
  final _dio = Dio();
  // 1. 主构造函数
  RequestDio() {
    // 正常写法:
    /* 基础地址
    _dio.options.baseUrl = GlobalVariable.BASE_URL;
    连接超时时间
    _dio.options.connectTimeout = const Duration(seconds: GlobalVariable.NEW_WORK_TIME_OUT);
    接收超时时间
    _dio.options.receiveTimeout = const Duration(seconds: GlobalVariable.NEW_WORK_TIME_OUT); */

    // 链式写法:
    _dio.options
      ..baseUrl = GlobalVariable.BASE_URL
      ..connectTimeout =
          const Duration(seconds: GlobalVariable.NEW_WORK_TIME_OUT)
      ..receiveTimeout =
          const Duration(seconds: GlobalVariable.NEW_WORK_TIME_OUT);

    // 添加拦截器
    _dio.interceptors.add(
      InterceptorsWrapper(
        onRequest: (context, handler) {
          // 在发送请求之前做一些事情 - 请求拦截器
          // 注入token
          handler.next(context); // 继续发送请求
        },
        onResponse: (context, handler) {
          // 在接收到响应数据之前做一些事情 - 响应拦截器
          handler.next(context); // 继续处理响应
        },
        onError: (context, handler) {
          // 在请求错误时做一些事情 - 错误拦截器
          handler.reject(context); // 继续处理错误
        },
      ),
    );
  }

  // 2. 定义方法
  get(String url, {Map<String, dynamic>? params}) {
    return _handleRes(_dio.get(url, queryParameters: params));
  }

  post(String url, {Map<String, dynamic>? data}) {
    return _handleRes(_dio.post(url, data: data));
  }

  put(String url, {Map<String, dynamic>? data}) {
    return _handleRes(_dio.put(url, data: data));
  }

  delete(String url,
      {Map<String, dynamic>? params, Map<String, dynamic>? data}) {
    return _handleRes(_dio.delete(url, queryParameters: params, data: data));
  }

  // 3. 数据剥离
  _handleRes(Future<Response<dynamic>> task) async {
    final res = await task;
    // 请求成功
    if (res.data['code'] == GlobalVariable.SUCCESS_CODE) {
      return res.data['data'];
    }
    // 请求失败
    throw DioException(requestOptions: res.requestOptions);
  }
}

final RequestDio requestDio = RequestDio();
